#[derive(Debug)]
pub enum MyError {
    IoError(String),
    Inexist(String),
}

// pub type Result<T> = std::result::Result<T, MyError>;

// pub fn fetch_id() -> Result<u64> {
//     let content = std::fs::read_to_string("/tmp/tmp_id")?;
//     let id = content.parse::<u64>()?;
//     Ok(id)
// }


// 这段代码不能编译通过，因为std::fs::read_to_string和String::parse的 返回值虽然都叫Result，
// 但却不是相同的类型(因为E被定义为库局部的错误了)。
// 因此，这里都不能直接使用?操作符。而是需要进行错误类型的翻译，转成我们自己定义的MyError：


//     pub fn fetch_id2() -> Result<u64> {
//     // 写法1： 写法1过入繁冗，实在称不上优雅
//     let content = match std::fs::read_to_string("/tmp/tmp_id") {
//         Ok(content) => content,
//         Err(_) => {
//             return Err(MyError::IoError("read /tmp/tmp_id failed.".to_owned()));
//         }
//     };
//     // 写法2：使用标准库函数 map_err  来完成错误类型的映射，会干净很多
//     let id = content
//         .parse::<u64>()
//         .map_err(|_| MyError::ParseError("parse error.".to_owned()))?;
//     Ok(id)
//     //如果映射的代码比较复杂，或者同样的处理会多次重复，就会希望将错误映射集的代码中起来
//     //社区中也提供了库来简化这部分处理，如：thiserror，anyhow
// }